package main

import (
	"fmt"
	"unicode/utf8"
)

func strings1() {
	s := "ABC我是初学者!" // UTF-8 编码, rune 类型
	fmt.Println(s, len(s))  // 打印长度为 19！ 

	// 1. 转为字节类型输出
	for _, b := range []byte(s) {
		fmt.Printf("%X ", b )
	}
	// 一字节的表示 打印如下： 中文为 3字节表示
	// 比如 E6 88 91 表示 "我" ， 是 UTF-8编码
	// 41 42 43 E6 88 91 E6 98 AF E5 88 9D E5 AD A6 E8 80 85 21
	fmt.Println()	

	// 2. 直接输出
	for i, ch := range s {
		fmt.Printf("(%d, %X)", i, ch)
	}
	// 结果： (0, 41)(1, 42)(2, 43)(3, 6211)(6, 662F)(9, 521D)(12, 5B66)(15, 8005)(18, 21) 

	// ch 为rune 类型（等价于 int32）四字节整数。
	// 6211表示 "我"， 是unicode编码。 且可以看到 下标递增三。
	// "我"： 过程，将s(string) 字符 utf-8解码：E6 88 91， 转为 unicode 6211， 再放到 rune类型 四字节类型中保存
	
	fmt.Println()

	// 3. 调用utf8这个库
	fmt.Println(utf8.RuneCountInString(s))
	// 打印结果为 9 

	// 拿到字节数组
	bytes := []byte(s)
	// 返回每个字符 和字符大小，英文1，中文3。 解码
	for len(bytes) > 0 {
		ch, size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		fmt.Printf("%c ", ch)
	}
	// 结果 A B C 我 是 初 学 者 !
	fmt.Println()

	// 转为rune 类型
	for i, ch := range []rune(s) {
		fmt.Printf("(%d, %c)", i, ch)
	}
	// 结果 (0, A)(1, B)(2, C)(3, 我)(4, 是)(5, 初)(6, 学)(7, 者)(8, !)
}

func main() {
	strings1()
}